# 1.
# 创建一个BankAccount类，要求：
# 有类属性bank_name（银行名称）
# 有实例属性account_name（账户名）和balance（余额）
# 有方法deposit(amount)（存款）和withdraw(amount)（取款）
# 有方法display()显示账户信息
# 修改上面的BankAccount类，将实例属性私有化，并提供相应的getter和setter方法，在setter方法中加入验证逻辑（余额不能为负数）。
# 为BankAccount类添加一个类方法change_bank_name(new_name)用于修改银行名称，
# 和一个静态方法calculate_interest(principal, rate, time)用于计算利息(金额，利率，时间)。
from xml.dom.minidom import ProcessingInstruction


class BankAccount:
    bank_name='中国银行'          #类属性
    def __init__(self,account_name,balance):
        self.__account_name=account_name   #实例属性
        self.__balance=balance
    @classmethod
    def change_bank_name(cls,new_name):
        cls.bank_name=new_name
    @staticmethod
    def calculate_interest(principal, rate, time):
        interest = principal * rate * time
        print(f'金额{principal},利率{ rate}, 时间{time},利息{interest}')

    def set_account_name(self,account_name):
        self.__account_name=account_name
    def set_balance(self,balance):
        if balance<0:
            self.__balance=0
        else:
            self.__balance=balance
    def get_account_name(self):
        return self.__account_name
    def get_balance(self):
        return self.__balance
    #方法
    def deposit(amount):
        print('-----存款-------')
    def withdraw(amount):
        print('-----取款-------')
    def display(self):
        print(f'{self.__account_name}账户的余额为{self.__balance}')
        print(f'所属银行：{self.bank_name}')

cc=BankAccount('张三',345)
cc.change_bank_name('建设银行')
print(cc.display())
print('----------------')
cc.calculate_interest(345,0.019,3)
# 2.
# 创建一个Animal类，实现以下魔术方法：
# __init__：初始化动物名称和年龄
# __str__：返回动物的描述信息
# __del__：在对象销毁时打印信息
class Animal:
    type = "大象"
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return f"{self.name}的物种为{Animal.type},年龄为{self.age}"
    def __del__(self):
        print("---对象被销毁时，执行该方法---")
dd=Animal('大壮',12)
pp=Animal('蒙多',34)
print(dd)
print(pp)

print('------------')
# 3）class Book:
#     def __init__(self, title, price):
#         self.title = title
#         self.price = price
#     # 请在此处添加 __str__ 方法
#
# # 测试代码
# book = Book("Python入门", 59.8)
# print(book) # 期望输出: 书名: 《Python入门》, 价格: 59.8元
class Book:
    def __init__(self, title, price):
        self.title = title
        self.price = price
    # 请在此处添加 __str__ 方法
    def __str__(self):
        return f"书名：《{self.title}》,价格：{self.price}元"
book = Book("Python入门", 59.8)
print(book)

# 请设计一个Rectangle(矩形）类。
# 。属性：私有属性_.1length（长)，__width（宽)。
# 。方法：
# _init._(self，length，width):初始化长和宽。
# set_length(self，1ength)和get_1ength(se1f)：设置和获取长度，设置时需检查长度是否大
# 于0。
# set_width (self，width）和get_width(self)：设置和获取宽度，设置时需检查宽度是否大于
# O。
# ◎get_area(se1f)：计算并返回矩形的面积。
# 。get_perimeter(self)：计算并返回矩形的 周长。
# _._str__(se1f)：返回矩形的描述信息，如"矩形[长=5.e，宽=3.e]”。
# 编写代码测试这个类，创建一个矩形对象，计算其面积和周长，并尝试设置一个非法的负值宽度。
class Rectangle:
    def __init__(self,length,width):
        self.__length=length
        self.__width=width
    def set_length(self,length):
        if length<=0:
            self.__length=0
        else:
            self.__length = length

    def set_width(self,width):
        if width <= 0:
            self.__width = 0
        else:
            self.__width = width

    def get_1ength(self):
        return  self.__length
    def get_width(self):
        return  self.__width

    def get_area(self):
        j=self.__length* self.__width
        print(f'面积为{j}')
        return j

    def get_perimeter(self):
        l=(self.__length+self.__width)*2
        print(f'周长为{l}')
        return l
    def __str__(self):
        return f'矩形[长={self.__length},宽={self.__width}]'
ss=Rectangle(4,3)
ss.get_area()
ss.get_perimeter()
print(ss)
